package com.hy.service.impl;

import com.auth0.jwt.exceptions.JWTCreationException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hy.dao.Us_tpMapper;
import com.hy.entitys.hy_front_userdb.Ums_member;
import com.hy.entitys.hy_front_userdb.Us_tp;
import com.hy.entitys.hy_front_userdb.User_lgtp;
import com.hy.service.IUms_memberService;
import com.hy.service.IUs_tpService;
import com.hy.service.IUser_lgtpService;
import com.hy.utils.HY_Result;
import com.hy.utils.JWTUtils;
import com.hy.utils.MapReflect;
import com.hy.utils.ResultCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

/**
 * 会员与类型关联表 服务实现类
 * @author HUAYI
 * @since 2020-12-14
 */
@Service
public class Us_tpServiceImpl extends ServiceImpl<Us_tpMapper, Us_tp> implements IUs_tpService {

    /**
     * 登录类型服务
     */
    @Autowired
    private IUser_lgtpService iuls;

    /**
     * 会员基本信息 - 业务层
     */
    @Autowired
    private IUms_memberService iums;

    /**
     * 注册页面
     */
    @Value("${download.Registered_HTML}")
    private String Registered_HTML;

    /**
     * 主页 地址
     */
    @Value("${download.Home_HTML}")
    private String Home_HTML;

    /**
     * 签名验证-登录
     * @param ut
     * @return
     */
    @Override
    public HY_Result signLogin(Us_tp ut) {
        //查询条件
        QueryWrapper<Us_tp> qu = new QueryWrapper<>();
        //类型 验证
        qu.eq("us_tp_tid", ut.getUsTpTid());
        if (!ObjectUtils.isEmpty(ut.getUsTpUid())){
            //增加 手机号验证 条件
            qu.eq("us_tp_uid", ut.getUsTpUid());
            //查询用户是否设置密码
            if (ObjectUtils.isEmpty(this.getOne(qu))){
                //密码未设置
                return HY_Result.PASSWORD_THIS();
            }
        }
        //签名 验证
        qu.eq("us_tp_sign", ut.getUsTpSign());
        Us_tp utp = this.getOne(qu);
        //判断是否匹配到用户
        if (!ObjectUtils.isEmpty(utp)){
            //验证成功
            return new HY_Result(ResultCode.SUCCESS,utp.getUsTpUid(),Home_HTML);
        }
        //账号获取密码不正确
        return new HY_Result(ResultCode.USERNAEM_PASSWORD_ERROR,null,Registered_HTML);
    }

    /**
     * 验证签名 是否存在
     * @return
     */
    @Override
    public Us_tp sign_Exist(Us_tp ut) {
        return this.getOne(new QueryWrapper<Us_tp>().eq("us_tp_uid",ut.getUsTpUid()).eq("us_tp_tid",ut.getUsTpTid()));
    }

    /**
     * 根据第三方 昵称 验证签名 是否存在
     * @param ut
     * @param user_Lgtp_Nickname
     * @return
     */
    @Override
    public HY_Result sign_Exist(Us_tp ut, String user_Lgtp_Nickname) {
        User_lgtp us_lgtp = iuls.getOne(new QueryWrapper<User_lgtp>().eq("user_lgtp_nickname", user_Lgtp_Nickname));
        if (!ObjectUtils.isEmpty(us_lgtp)){
            Us_tp us_tp = sign_Exist(ut);
            if (ObjectUtils.isEmpty(us_tp)){
                //操作成功
                return HY_Result.SUCCESS();
            }
        }
        //操作失败
        return HY_Result.FAILURE();
    }

    /**
     * 登录认证 返回JWT_Token
     * @param ut
     * @return
     */
    @Override
    public HY_Result Ut_JWT_Token(Us_tp ut){
        HY_Result rs = signLogin(ut);
        if (rs.isSuccess()) {
            //根据uid查询 用户
            Ums_member um = iums.findUid(Integer.valueOf(rs.getData().toString()));
            if (!ObjectUtils.isEmpty(um)) {
                String tk;
                try {
                    //第一个参数 Map<String,String>(只能为Stringg类型),第二个参数时间(单位分钟)
                    tk = JWTUtils.getToken(MapReflect.t_mapS(um), 30);
                } catch (Exception e) {
                    throw new JWTCreationException("JWT加密异常!", new RuntimeException());
                }
                //认证成功
                return new HY_Result(ResultCode.SUCCESS, tk, Home_HTML);
            }
            //数据库异常
            return HY_Result.SERVER_ERROR();
        }
        return rs;
    }

    @Override
    public HY_Result Um_JWT_Token(Ums_member um){
        String tk;
        try {
            //第一个参数 Map<String,String>(只能为Stringg类型),第二个参数时间(单位分钟)
            tk = JWTUtils.getToken(MapReflect.t_mapS(um), 30);
        } catch (Exception e) {
            throw new JWTCreationException("JWT加密异常!", new RuntimeException());
        }
        //认证成功
        return new HY_Result(ResultCode.SUCCESS, tk, Home_HTML);
    }
}
